package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import com.atguigu.gmall.model.list.SearchResponseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/*商品搜索页面*/
@Controller
public class ListController {


    @Autowired
    private ListFeignClient listFeignClient;

    @GetMapping("/list")
    public String list(SearchParam searchParam, Model model){
        //1、回显页面关键词
        model.addAttribute("searchParam",searchParam);

        //2、根据关键词等相关条件查询的返回值对象
        SearchResponseVo responseVo = listFeignClient.search(searchParam);

        //3、开始封装前端页面需要的值放进model中,结合前端是如何接收数据的key
        //（1）品牌集合
        model.addAttribute("trademarkList",responseVo.getTrademarkList());
        //（2）urlPara 在页面的url中拼接参数，以便向后端告知点了哪些属性，也是向前端的返回数据参数
        String urlParam = buildUrlParam(searchParam);//组装urlParam参数，比较复杂，提取出来
        model.addAttribute("urlParam",urlParam);
        //（3）平台属性
        model.addAttribute("attrsList",responseVo.getAttrsList());
        //（4）排序回显
        Map orderMap = buildOrderMap(searchParam);//抽取
        model.addAttribute("orderMap", orderMap);
        //（5）结果集
        model.addAttribute("goodsList",responseVo.getGoodsList());
        //（6）当前页和总页数
        model.addAttribute("pageNo",responseVo.getPageNo());
        model.addAttribute("totalPages",responseVo.getTotalPages());

        //（7）面包屑——选择品牌之后回显已选择结果
        String trademarkParam = buildTrademarkParam(searchParam);
        model.addAttribute("trademarkParam",trademarkParam);

        //（8）面包屑——择平台属性之后回显已选择平台属性结果
        List<Map> propsParamList = buildPropsParamList(searchParam);
        model.addAttribute("propsParamList",propsParamList);

        return "list/index";
    }


    //择平台属性之后回显已选择平台属性结果
    private List<Map> buildPropsParamList(SearchParam searchParam) {
        String[] props = searchParam.getProps();
        if (props != null && props.length>0){
            //props=23:4G:运行内存
            return Arrays.stream(props).map(prop->{
                String[] p = prop.split(":");
                Map map = new HashMap();
                map.put("attrId",p[0]);
                map.put("attrValue",p[1]);
                map.put("attrName",p[2]);

                return map;
            }).collect(Collectors.toList());
        }
        return null;//页面没有选择平台属性时，就反回null
    }


    //选择品牌之后回显已选择结果
    private String buildTrademarkParam(SearchParam searchParam) {
        String trademark = searchParam.getTrademark();
        if (!StringUtils.isEmpty(trademark)){
            //trademark=2:华为
            String[] t = trademark.split(":");
            return "品牌"+t[1];
        }
        return null;//没有值就是null，前端就不会显示品牌信息的面包屑
    }


    //构建页面排序 红底样式回显  ASC DESC回显
    private Map buildOrderMap(SearchParam searchParam) {
        Map map = new HashMap<>();
        // order=     1:asc    排序规则   0:asc
        String order = searchParam.getOrder();
        if (!StringUtils.isEmpty(order)){
            String[] o = order.split(":");
            map.put("type",o[0]);//1
            map.put("sort",o[1]);//asc

        }else {//参数为空时，给默认值
            map.put("type","1");//1
            map.put("sort","asc");//asc

        }
        return map;
    }





    /*组装urlParam参数，比较复杂，提取出来*/
    private String buildUrlParam(SearchParam searchParam) {
        //StringBuilder 性能高  线程不安全  企业上班要求使用此方式,此处是绝对安全的：SpringIOC容器是单例模式 ，本方法复制一份到本地线程中让线程执行，不直接执行本方法
        //StringBuffer 性能低  线程安全
        StringBuilder stringBuilder = new StringBuilder();
        String keyword = searchParam.getKeyword();
        if (!StringUtils.isEmpty(keyword)) {
            stringBuilder.append("keyword=").append(searchParam.getKeyword());
        }//keyword必须存在，否则前端URL语句会出现“?&”相拼接的情况

        String trademark = searchParam.getTrademark();
        if (!StringUtils.isEmpty(trademark)) {
            stringBuilder.append("&trademark=").append(searchParam.getTrademark());
        }
        String[] props = searchParam.getProps();
        if (null != props && props.length > 0) {
            for (String prop : props) {
                stringBuilder.append("&props=").append(prop);
            }
        }
        return "/list?" + stringBuilder.toString();

    }


}
